#include "client.h"

int dealCommand(const int sockfd, const char *username, const char *passwd){

    // 定义TLV结构体
    tlvPacket_t tlv;
    memset(&tlv, 0, sizeof(tlv));

    // 初始化聊天头
    char cHeadName[4096] = {0};
    strcpy(cHeadName, username);
    static char cHead[4096] = {0};
    // 第一次加/， 后面传的都有/了
    if(strlen(cHead) == 0){
        cHeadName[strlen(cHeadName)] = '/';
    }
    strcat(cHeadName, cHead);

    printf("> %s: ", cHeadName);
    fflush(stdout);

    char buffer[4096] = {0};
    char command[4096] = {0};
    char parameter[4096] = {0};
    char strtokBuffer[4096] = {0};

    // 获取stdin命令和参数
    fgets(buffer, sizeof(buffer), stdin);

    // 去除最后一个换行符
    if(buffer[strlen(buffer)-1] == '\n'){
        buffer[strlen(buffer)-1] = 0;
    }

    // 复制客户端输入
    memcpy(strtokBuffer, buffer, sizeof(buffer));
    const char delimiters[] = " "; // 截断依据

    // 截取命令
    char *token = strtok(strtokBuffer, delimiters);
    memcpy(command, token, strlen(token));

    // 截取参数
    token = strtok(NULL, delimiters);
    //printf("file = %s\n", token);
    if(token != NULL){
        memcpy(parameter, token, strlen(token));
    }

    char content[4096] = {0}; // 接收内容
    int mark = 0; // 接受标志

    // 日志记录
    LOG(username, command);

    if(strcmp(command, "cd") == 0){
        // 如果cd后没有参数
        if(strlen(parameter) == 0){
            printf("Invalid command: cd!\n");
            return -1;
        }

        // 发送命令
        tlv.type = CD;
        tlv.length = strlen(parameter);
        memcpy(tlv.value, parameter, tlv.length);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("cd false!\n");
            return -1;
        }

        // 接收路径
        recv(sockfd, &tlv.type, sizeof(commandType_t), MSG_WAITALL);
        recv(sockfd, &tlv.length, sizeof(int), MSG_WAITALL);
        recv(sockfd, tlv.value, tlv.length, MSG_WAITALL);
        memset(cHead, 0, sizeof(cHead));
        memcpy(cHead, tlv.value, tlv.length);
    }
    else if(strcmp(command, "ls") == 0){

        // 发送命令
        tlv.type = LS;
        tlv.length = strlen(parameter);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("ls false!\n");
            return -1;
        }

        // 接受内容
        recv(sockfd, &tlv.type, sizeof(commandType_t), MSG_WAITALL);
        recv(sockfd, &tlv.length, sizeof(int), MSG_WAITALL);
        //printf("length pass\n");
        if(tlv.length == 0){
            return 0;
        }
        recv(sockfd, tlv.value, tlv.length, MSG_WAITALL);
        //printf("value pass\n");
        memcpy(content, tlv.value, tlv.length);
        //printf("memcpy pass\n");

        printf("%s\n", content);

    } 
    else if(strcmp(command, "tree") == 0){

        // 发送命令
        tlv.type = TREE;
        tlv.length = strlen(parameter);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("tree false!\n");
            return -1;
        }

        // 接受内容
        recv(sockfd, &tlv.type, sizeof(commandType_t), MSG_WAITALL);
        recv(sockfd, &tlv.length, sizeof(int), MSG_WAITALL);
        //printf("length pass\n");
        if(tlv.length == 0){
            return 0;
        }
        recv(sockfd, tlv.value, tlv.length, MSG_WAITALL);
        //printf("value pass\n");
        memcpy(content, tlv.value, tlv.length);
        //printf("memcpy pass\n");

        printf("%s\n", content);

    }
    else if(strcmp(command, "pwd") == 0){
        printf("%s\n", cHeadName);
    }

    else if(strcmp(command, "mkdir") == 0){

        // 如果mkdir后没有参数
        if(strlen(parameter) == 0){
            printf("Invalid command: mkdir!\n");
            return -1;
        }

        // 发送命令
        tlv.type = MKDIR;
        tlv.length = strlen(parameter);
        memcpy(tlv.value, parameter, tlv.length);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("mkdir false\n");
            return -1;
        }
    }

    else if(strcmp(command, "rmdir") == 0){

        // 如果rmdir后没有参数
        if(strlen(parameter) == 0){
            printf("Invalid command: rmdir!\n");
            return -1;
        }

        // 发送命令
        tlv.type = RMDIR;
        tlv.length = strlen(parameter);
        memcpy(tlv.value, parameter, tlv.length);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("rmdir false\n");
            return -1;
        }
    }

    else if(strcmp(command, "remove") == 0){

        // 如果remove后没有参数
        if(strlen(parameter) == 0){
            printf("Invalid command: remove!\n");
            return -1;
        }

        // 发送命令
        tlv.type = RM;
        tlv.length = strlen(parameter);
        memcpy(tlv.value, parameter, tlv.length);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("remove false\n");
            return -1;
        }
    }

    else if(strcmp(command, "puts") == 0){

        // 如果puts后没有参数
        if(strlen(parameter) == 0){
            printf("Invalid command: puts!\n");
            return -1;
        }

        // 发送命令
        tlv.type = PUTS;
        tlv.length = strlen(parameter);
        memcpy(tlv.value, parameter, tlv.length);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);


        //printf("command have send\n");


        puts_client(sockfd, parameter);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);


        //printf("mark have recv\n");


        if(mark == -1){
            printf("puts false!\n");
            return -1;
        }


        //printf("puts_client have done\n");


    }

    else if(strcmp(command, "gets") == 0){

        // 如果gets后没有参数
        if(strlen(parameter) == 0){
            printf("Invalid command: gets!\n");
            return -1;
        }

        // 发送命令
        tlv.type = GETS;
        tlv.length = strlen(parameter);
        memcpy(tlv.value, parameter, tlv.length);
        send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
             tlv.length, MSG_NOSIGNAL);

        gets_client(sockfd, parameter);

        // 接受标志
        recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
        if(mark == -1){
            printf("gets false!\n");
            return -1;
        }
    }

    else if(strcmp(command, "logout") == 0){

        close(sockfd);
        exit(-1);

    }

    else if(strcmp(command, "logoff") == 0){

        // 验证密码
        char *tmp = getPassword("请输入密码：");
        if(strcmp(tmp, passwd) == 0){

            // 发送命令
            tlv.type = ACCOUNTDELETE;
            tlv.length = strlen(parameter);
            send(sockfd, &tlv, sizeof(tlv.type)+sizeof(tlv.length)+
                 tlv.length, MSG_NOSIGNAL);

            // 接受标志
            recv(sockfd, &mark, sizeof(int), MSG_WAITALL);
            if(mark == -1){
                printf("logoff false!\n");
                free(tmp); // 释放堆空间
                return -1;
            }
            printf("用户已删除！\n");
            exit(0);
        }
        else{
            printf("密码错误！\n");
        }
        free(tmp); // 释放堆空间

    }
    else{
        printf("command is not existence!\n");
        return -1;
    }

    return 0;
}
